home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '87 / Source ƒ.sea / Source ƒ / Pascal ƒ / TOOLS / grep next >
Encoding:
Text File  |  1987-02-27  |  4.4 KB  |  294 lines  |  [TEXT/MACA]

  1. /* GREP.C  a generalized regualr expression parser. */
  2.  
  3. #include    "stdio.h"
  4. #include    "argsim.h"
  5. #include    "tools.h"
  6.  
  7. #define    MAXLINE        128
  8. #define    MAX_EXPR    64
  9.  
  10. int    vflag, yflag, cflag, lflag, nflag, hflag, fflag ;
  11.  
  12. main(argc, argv)
  13. int    argc ;
  14. char    **argv ;
  15. {
  16.     int    i, j, linenum, count ;
  17.     int    line[MAXLINE] ;
  18.     int    numfiles ;
  19.     FILE    *stream ;
  20.     int    exprc ;
  21.     TOKEN    *exprv[MAX_EXPR] ;
  22.     
  23. #ifdef    DEBUG
  24.     fprintf(stderr, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") ;
  25. #endif
  26.     i = 1 ;
  27.     if(argc<2)
  28.         abort(pr_usage(1)) ;
  29.     if(*argv[i] == '-')
  30.     {
  31.         expand_sw(argv[i++]) ;
  32.         if(i == argc)
  33.             abort(pr_usage(1)) ;
  34.     }
  35.     if((exprc = get_expr(exprv, MAX_EXPR, &argv[i++])) == 0)
  36.         abort (pr_usage(2)) ;
  37.     numfiles = argc - 1 ;
  38.     do
  39.     {
  40.         if(numfiles)
  41.         {
  42.             stream = fopen(argv[i], "r") ;
  43.             if(stream == NULL)
  44.             {
  45.                 fprintf(stderr, "Can't open %s\n", argv[i]) ;
  46.                 getchar() ;
  47.                 continue ;
  48.             }
  49.         }
  50.         else
  51.         {
  52.             stream = stdin ;
  53.         }
  54.         count = 0 ;
  55.         linenum = 1 ;
  56.         while (fgets(line, MAXLINE, stream))
  57.         {
  58. #ifdef CPM
  59.             if(!fflag || yflag)
  60.                 stoupper(line) ;
  61. #else
  62.             if(yflag)
  63.                 stoupper(line) ;
  64. #endif
  65.             for(j=exprc; --j >= 0; )
  66.             {
  67.                 if(matchs(line, exprv[j]))
  68.                 {
  69.                     count++ ;
  70.                     pr_match(linenum, line, argv[i], 1, numfiles) ;
  71.                 }
  72.                 else
  73.                 {
  74.                     pr_match(linenum, line, argv[i], 0, numfiles) ;
  75.                 }
  76.                 linenum++ ;
  77.                 cntrl_c() ;
  78.             }
  79.             if(lflag && count)
  80.                 break ;
  81.         }
  82.         pr_count(numfiles, argv[i], count) ;
  83.         fclose(stream) ;
  84.     } while(++i < argc) ;
  85.     OSreset() ;
  86.     abort() ;
  87. }
  88.  
  89.  
  90.  
  91.  
  92.  
  93. pr_count (fcount, fname, count)
  94. int    fcount, count ;
  95. char    *fname ;
  96. {
  97. #ifdef    DEBUG
  98.     fprintf(stderr, "pr_count entered.\n") ;
  99. #endif
  100.     if(!cflag)
  101.         return ;
  102.     if(fcount > 1)
  103.         printf("%-12s: ", fname) ;
  104.     printf("%d\n", count) ;
  105. }
  106.  
  107.  
  108.  
  109.  
  110. pr_match (linenum, line, fname, match, numfiles)
  111. int    linenum, match, numfiles ;
  112. char    *line, *fname ;
  113. {
  114.     char    buf[80] ;
  115. #ifdef    DEBUG
  116.     fprintf(stderr, "pr_match entered.\n") ;
  117. #endif
  118.     if(cflag)
  119.         return ;
  120.     if((vflag && !match) || (!vflag && match))
  121.     {
  122.         if(!hflag && ((numfiles > 1) || lflag))
  123.             printf("%s%s", fname, lflag ? "\n" : ":") ;
  124.         if(nflag)
  125.             printf("%03d:", linenum) ;
  126.         if(!lflag)
  127.             printf("%s", line) ;
  128.     }
  129. }
  130.  
  131.  
  132.  
  133.  
  134. pr_usage (num)
  135. int    num ;
  136. {
  137. #ifdef DEBUG
  138.     fprintf(stderr, "%d ", num) ;
  139. #endif
  140.     fprintf(stderr, "usage: grep [-cefhlnvy] [expression] ,<files...>\n") ;
  141. }
  142.  
  143.  
  144.  
  145.  
  146. abort ()
  147. {
  148.     exit() ;
  149. }
  150.  
  151.  
  152.  
  153.  
  154. expand_sw (str)
  155. char    *str ;
  156. {
  157.     vflag = 0;
  158.     cflag = 0 ;
  159.     lflag = 0 ;
  160.     nflag = 0 ;
  161.     hflag = 0 ;
  162.     fflag = 0 ;
  163.     yflag = 0 ;
  164. #ifdef    DEBUG
  165.     fprintf(stderr, "expand_sw entered.\n") ;
  166. #endif
  167.     while(*str)
  168.     {
  169.         switch(toupper(*str))
  170.         {
  171.         case '-':
  172.         case 'E':    break ;
  173.         case 'C':    cflag = 1 ;    break ;
  174.         case 'F':    fflag = 1 ;    break ;
  175.         case 'H':    hflag = 1 ;    break ;
  176.         case 'L':    lflag = 1 ;    break ;
  177.         case 'N':    nflag = 1 ;    break ;
  178.         case 'V':    vflag = 1 ;     break ;
  179.         case 'Y':    yflag = 1 ;    break ;
  180.         defalut:    pr_usage(3) ;
  181.                 abort() ;
  182.                 break ;
  183.         }
  184.         str++ ;
  185.     }
  186. }
  187.  
  188.  
  189.  
  190.  
  191. int do_or (lp, expr, max)
  192. char    *lp ;
  193. TOKEN    **expr ;
  194. int    max ;
  195. {
  196.     int    found ;
  197.     TOKEN    *pat ;
  198.     char    *op ;
  199. #ifdef    DEBUG
  200.     fprintf(stderr, "do_or entered.\n") ;
  201. #endif
  202.     
  203.     found = 0 ;
  204.     if(yflag)
  205.         stoupper(lp) ;
  206.     while (op = in_string(OR_SYM, lp))
  207.     {
  208.         if(found <= max && (pat = makepat(lp, OR_SYM)))
  209.         {
  210.             *expr++ = pat ;
  211.             found++ ;
  212.         }
  213.         lp = ++op ;
  214.         if(pat == 0)
  215.             goto fatal_err ;
  216.     }
  217.     if(found <= max && (pat = makepat(lp, OR_SYM)))
  218.     {
  219.         found++ ;
  220.         *expr = pat ;
  221.     }
  222.     if(pat == 0)
  223.     {
  224.     fatal_err:
  225.             printf("Illegal expression\n") ;
  226.             exit() ;
  227.     }
  228.     return(found) ;
  229. }
  230.  
  231.  
  232.  
  233.  
  234. get_expr (expr, max, defexpr)
  235. TOKEN    *expr[] ;
  236. int    max ;
  237. char    **defexpr ;
  238. {
  239.     FILE    *stream ;
  240.     int    count ;
  241.     char    line[MAXLINE] ;
  242. #ifdef DEBUG
  243.     int i ;
  244.     fprintf(stderr, "get_expr entered.\n") ;
  245. #endif
  246.     count = 0 ;
  247.     if(fflag)
  248.     {
  249. #ifdef    DEBUG
  250.         fprintf(stderr, "fflag true in get_expr\n") ;
  251. #endif
  252.         if((stream = fopen(*defexpr, "r")) == NULL)
  253.         {
  254.             fprintf(stderr, "Can't open %s\n", *defexpr) ;
  255.             abort() ;
  256.         }
  257.         while((max - count) && fgets(line, MAXLINE, stream))
  258.         {
  259.             count += do_or(line, &expr[count], max - count) ;
  260. #ifdef    DEBUG
  261.             fprintf(stderr, "Count = %d\n", count) ;
  262. #endif
  263.         }
  264.         fclose(stream) ;
  265.     }
  266.     else
  267.     {
  268.         if(count += do_or(*defexpr, &expr[count], max - count))
  269.             *defexpr = " " ;
  270.     }
  271. #ifdef DEBUG
  272.     for(i=count; --i >= 0; )
  273.     {
  274.         pr_tok(expr[i]) ;
  275.         printf("----------------------------------------------\n") ;
  276.     }
  277. #endif
  278.     return(count) ;
  279. }
  280.  
  281.  
  282.  
  283.  
  284. cntrl_c()
  285. {
  286. #ifdef CPM
  287.     if(bdos(11) && ((bdos(1,0) & ox7f) == 0x03))
  288.         abort() ;
  289. #endif
  290. #ifdef    DEBUG
  291.     fprintf(stderr, "cntrl_c entered.\n") ;
  292. #endif
  293. }